package com.and9.mchen.mcmusic.dao;

import java.util.List;

import com.and9.mchen.mcmusic.entity.Album;
import com.and9.mchen.mcmusic.exception.DaoException;

/**
 * 
 * @author MC
 * @version  1.0
 */
public interface IAlbumDao {

	String[] BASEPROPERTYNAMES={"albumName", "issueTime", "musicLanguage", "recordCompany"};
	
	/**
	 * <p>
	 * album对象不能为null album的imageUrl也不能为null<br/>
	 * 如果album、 imageUrl里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  -1
	 * </p>  
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>创建album和imageUrl关系成功的次数
	 * @throws DaoException
	 */
	int createAlbumImageUrlRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的singer也不能为null<br/>
	 * 如果album、 singer里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  -1
	 * </p> 
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>创建album和singer关系成功的次数
	 * @throws DaoException
	 */
	int createAlbumSingerRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的集合songs也不能为null<br/>
	 * 如果album、 songs里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  null
	 * </p>
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>创建album和song关系成功的次数
	 * @throws DaoException
	 */
	int[] createAlbumSongRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * 如果album对象为null<br/>
	 * 则返回-1
	 * </p>
	 * <p>
	 * 保存对象到数据库的时候，album的id为null或者0即可<br/>
	 * 保存对象时，propertyNames只要传null即可<br/>
	 * </p>
	 * <p>
	 * 更新对象的时候，不准更新album父类的属性<br/>
	 * 如果存在父类属性，则会修改propertyNames属性为album属性
	 * </p>
	 * @param album
	 * @param propertyNames
	 * @return 
	 * 创建或更新<tt>album</tt>的成功次数
	 * @throws DaoException
	 */
	int createOrUpdateAlbum(Album album, String... propertyNames)throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0</br>
	 * 则返回-1
	 * </p>
	 * @param id
	 * @return 
	 * 通过album的<tt>id</tt>删除album的成功次数
	 * @throws DaoException
	 */
	int deleteAlbumByAlbumId(long id) throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0</br>
	 * 则返回 null
	 * </p> 
	 * @param id
	 * @return
	 * 根据album的<tt>id</tt>查找album<br/>
	 * 查找失败返回null
	 * @throws DaoException
	 */
	Album getAlbumByAlbumId(long id) throws DaoException;
	
	/**
	 * <p>
	 * 如果unqueId 为null、""或找不到</br>
	 * 则返回null
	 * </p> 
	 * @param uniqueId
	 * @return
	 * 根据album的<tt>unqiueId</tt>查找album<br/>
	 * 查找失败返回null
	 * @throws DaoException
	 */
	Album getAlbumByAlbumUniqueId(String uniqueId) throws DaoException;
	
	/**
	 * <p>
	 * 根据singer的<tt>id</tt>和页数<tt>pageNum</tt>、每页显示的个数<tt>pageCount</tt>、排序返回<tt>orderBy</tt><br/>
	 * 返回albums
	 * </p> 
	 * @param id
	 * @param pageNum
	 * @param pageCount
	 * @param orderBy
	 * @return
	 * 返回albums
	 * @throws DaoException
	 */
	List<Album> getAlbumsBySingerId(long id, int pageNum, int pageCount, String orderBy) throws DaoException;
	
	/**
	 * <p>
	 * 根据singer<tt>id</tt>返回数据库的album的总个数
	 * </p>  
	 * @param id
	 * @return
	 * 返回根据singer<tt>id</tt>album总数
	 * @throws DaoException
	 */
	long getAlbumsCountBySingerId(long id) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的imageUrl也不能为null<br/>
	 * 如果album、 imageUrl里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回 -1
	 * </p> 
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>去除album和imageUrl关系成功的次数
	 * @throws DaoException
	 */
	int removeAlbumImageUrlRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的singer也不能为null<br/>
	 * 如果album、 singer里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  null
	 * </p> 
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>去除album和singer关系成功的次数
	 * @throws DaoException
	 */
	int removeAlbumSingerRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的集合songs也不能为null<br/>
	 * 如果album、 songs里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  null
	 * </p> 
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>去除album和song关系成功的次数
	 * @throws DaoException
	 */
	int[] removeAlbumSongRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * 根据singer的<tt>id</tt>和song<tt>id</tt>
	 * 返回album 返回issueTime最新的album
	 * @param singer_id
	 * @param song_id
	 * @return
	 * 返回album
	 * @throws DaoException
	 */
	Album getAlbumBySingerSongId(long singer_id, long song_id) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的集合musicStyles也不能为null<br/>
	 * 如果album、 musicStyles里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  null
	 * </p>  
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>添加album和musicStyles关系成功的次数
	 * @throws DaoException
	 */
	int[] createAlbumMusicStyleRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的集合musicStyles也不能为null<br/>
	 * 如果album、 musicStyles里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  null
	 * </p> 
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>去除album和musicStyles关系成功的次数
	 * @throws DaoException
	 */
	int[] removeAlbumMusicStyleRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的statistics也不能为null<br/>
	 * 如果album、 statistics里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  -1
	 * </p>  
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>添加album和statistics关系成功的次数
	 * @throws DaoException
	 */
	int createAlbumStatisticsRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的statistics也不能为null<br/>
	 * 如果album、 statistics里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  -1
	 * </p>  
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>去除album和statistics关系成功的次数
	 * @throws DaoException
	 */
	int removeAlbumStatisticsRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的introduction也不能为null<br/>
	 * 如果album、 introduction里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  -1
	 * </p>  
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>添加album和introduction关系成功的次数
	 * @throws DaoException
	 */
	int createAlbumrIntroductionRelevanceByAlbum(Album album) throws DaoException;
	
	/**
	 * <p>
	 * album对象不能为null album的introduction也不能为null<br/>
	 * 如果album、 introduction里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  -1
	 * </p>  
	 * @param album
	 * @return
	 * 返回通过<tt>album</tt>去除album和introduction关系成功的次数
	 * @throws DaoException
	 */
	int removeAlbumIntroductionRelevanceByAlbum(Album album) throws DaoException;
	
	List<Album> getAlbums(String sql, int pageNum, int pageCount, Object... params) throws DaoException;
}
